XLAの基本概念については、『Oracle TimesTen In-Memory Databaseアーキテクチャ概要』のイベント通知に関する章を参照してください。この項では、XLAの重要な概念について詳しく説明します。この項の内容は次のとおりです。
TimesTen XLAは、次のいずれかのモードで初期化できます。
永続モードまたは非永続モードのいずれでトランザクション・ログにアクセスするかは、TimesTenデータ・ストアをオープンするために使用する次の関数によって決まります。
ほとんどの場合は、ttXlaPersistOpenを使用します。ttXlaOpenTimesTen関数は、主に下位互換性を保つためのものです。ただし、永続モードはディスク・ベースのロギングでのみサポートされているため、ディスクレス・ロギングが必要な場合は、XLA接続を非永続モードでオープンします。
TimesTenは、初期作成時に、アプリケーションがリンクされているTimesTenリリースと同じバージョンに、トランザクション・ログ・ハンドルを構成します。また、ttXlaGetVersionおよびttXlaSetVersion関数を使用して、以前のXLAバージョンと相互運用することもできます。
アプリケーションによってTimesTenデータ・ストアが変更されると、TimesTenは、データ・ストアおよびトランザクション・コミットなどの他のイベントに対して行われた変更を示すログ・レコードを生成します。
新しいログ・レコードは、生成されると常にログ・バッファの最後に書き込まれます。
TimesTenでディスク・ベースのロギングが有効になっている場合は、メモリー内のログ・バッファからディスク上のログ・ファイルに、ログ・レコードが定期的にバッチでフラッシュされます。XLAが永続モードで初期化されている場合、XLAアプリケーションでディスクまたはメモリーに存在するログの一部に接続する必要はありません。したがって、この章で使用する「トランザクション・ログ」という用語は、トランザクション更新レコードの仮想ソースを指します。これらのレコードが物理的にメモリーに保存されているか、ディスクに保存されているかは関係ありません。
アプリケーションで、XLAを使用し、TimesTenデータ・ストアへの変更に関してトランザクション・ログを監視できます。XLAは、トランザクション・ログ全体を読み取り、ログ・レコードをフィルタ処理し、目的の表および列への変更が含まれているトランザクション・レコードのリストをXLAアプリケーションに配信します。
XLAは、レコードをディスクリート・トランザクションにソートします。複数のアプリケーションが同時にデータ・ストアを更新している場合、異なるアプリケーションのログ・レコードがログに交互配置されます。
XLAは、特定のトランザクションに関連するすべてのログ・レコードを透過的に抽出し、それらを連続するリストにしてアプリケーションに配信します。
コミット済のトランザクションのレコードのみが返されます。コミット済のレコードは、最後のコミット・レコードがトランザクション・ログに書き込まれる順序で返されます。コミットされていないデータ・ストアへの変更に関連するレコードは、XLAによってフィルタ処理されます。
変更が行われ、その後にロールバックされた場合、強制終了されたトランザクションのレコードはアプリケーションに配信されません。
これらのXLAの基本概念のほぼすべてを例3.1に示し、次にそれぞれの内容を箇条書きで示します。
図3.1に示すトランザクション・ログを例として考えてみます。
図3.1
トランザクション・ログから抽出されるレコード
この例では、トランザクション・ログに次のレコードが含まれています。
CT1 - Application C updates row 1 of table W with value 7.7 BT1 - Application B updates row 3 of table X with value 2 CT2 - Application C updates row 9 of table W with value 5.6 BT2 - Application B updates row 2 of table Y with value XYZ AT1 - Application A updates row 1 of table Z with value 3 AT2 - Application A updates row 3 of table Z with value 4 BT3 - Application B commits its transaction AT3 - Application A rolls back its transaction CT3 - Application C commits its transaction表W、YおよびZへの変更を検出するように設定されているXLAアプリケーションでは次のようになります。
BT2 and BT3 - Update row 2 of table Y with value XYZ and commit CT1 - Update row 1 of table W with value 7.7 CT2 and CT3 - Update row 9 of table W with value 5.6 and commitこの例では、次のことが示されています。
XLAを使用すると、表およびマテリアライズド・ビューの両方への変更を追跡できます。マテリアライズド・ビューによって、複数のディテール表内の選択した行および列への変更を追跡できる単一のソースが提供されます。マテリアライズド・ビューがない場合は、XLAアプリケーションで、すべてのディテール表の更新レコード(アプリケーションにとって重要ではない行および列への更新が反映されているレコードを含む)に対して監視およびフィルタ処理を行う必要があります。
一般に、表またはマテリアライズド・ビューへの変更を追跡するために使用するXLAメカニズムの間に処理上の違いはありません。
XLAでのマテリアライズド・ビューの動作の概要は、『Oracle TimesTen In-Memory Databaseアーキテクチャ概要』のイベント通知に関する章を参照してください。マテリアライズド・ビューの概要は、『Oracle TimesTen In-Memory Database APIおよびSQLリファレンス・ガイド』のSQL文に関する章のCREATE MATERIALIZED VIEWの項および『Oracle TimesTen In-Memory Databaseオペレーション・ガイド』のマテリアライズド・ビューの理解に関する項を参照してください。
永続トランザクション・ログの各リーダーは、ブックマークを使用して更新ログ・ストリーム内での位置を維持します。各ブックマークは、ログ順序番号(LSN)を使用してトランザクション・ログ内の更新レコードを追跡する2つのポインタで構成されています。
ttXlaPersistOpen関数をコールして永続XLAハンドルを初期化する場合は、tagパラメータを使用して新しいブックマークまたはシステムに既存のブックマークのいずれかを指定します(「XLAの初期化およびXLAハンドルの取得」を参照)。この時点で、ブックマークに関連付けられている初期読取りLSNは、永続XLAハンドル(ttXlaHandle_h)にキャッシュされているデータ・ストアから読み込まれ、トランザクション・ログに読取り開始位置を示します。
アプリケーションが最初にXLAを初期化し、XLAハンドルを取得した時点では、現行読取りLSNポインタは初期読取りLSNポインタと同じです。図3.2に示すように、両方ともデータ・ストアに最後に書き込まれたレコードを指しています。
図3.2 永続XLAハンドルを初期化した時点でのLSNの位置
ttXlaNextUpdateまたはttXlaNextUpdateWait関数を使用すると、一連のコミット済トランザクションのレコードが、コミットされた順序で返されます(「トランザクション・ログからの更新レコードの取得」を参照)。図3.3に示すように、ttXlaNextUpdateをコールするたびに、ブックマークの現行読取りLSNポインタは、最後に読み取られたレコードに再設定されます。現行読取りLSNポインタによって、次にttXlaNextUpdateをコールする場合の開始位置がマークされます。
図3.3 ttXlaNextUpdate()によって取得されるレコード
ttXlaGetLSNおよびttXlaSetLSN関数を使用すると、レコードを再度読み取ることができます(「ブックマークの位置の変更」を参照)。ただし、図3.4に示すように、ttXlaAcknowledge関数をコールすると、ブックマークの初期読取りLSNおよび現行読取りLSNが永続的に再設定されます。ttXlaAcknowledge関数をコールして初期読取りLSNを再設定すると、以前に読み取られたすべてのトランザクション・レコードにパージのフラグが設定されます。初期読取りLSNを再設定すると、ttXlaSetLSN関数を使用して元に戻し、以前に読み込んだトランザクションを再度読み取ることはできません。
図3.4 ttXlaAcknowledgeによるブックマークの再設定
TimesTenデータ・ストアで作成されるブックマークの数に制限はありません。各ブックマークは、一度に1つのみのアクティブな永続接続と関連付けることができます。ただし、ブックマークは、存続期間中に多数の接続と関連付けることができます。アプリケーションによって、永続接続をオープンし、新しいブックマークを作成し、そのブックマークを接続と関連付け、ブックマークを使用してレコードを読み取り、接続を切断(場合によってはデータ・ストアから切断)し、データ・ストアに再接続し、新しい永続接続を作成し、この新しい接続を既存のブックマークと関連付け、以前の接続が停止された永続トランザクション・ログ・レコードの読取りを続行することができます。